import telebot
from telebot import types
import json
import random
from datetime import datetime, timedelta


# IDK how this job
# Special for Gadji Deadline
log_chats = []
question_day = 3
question_hour = 16

def is_question_time():
    moscow_time = datetime.utcnow() + timedelta(hours=3)  # Учитываем разницу с UTC для Московского времени
    return moscow_time.weekday() == question_day and moscow_time.hour == question_hour

##

chats_file = 'chats.json'

with open('users.json', 'r') as file:
    users_data = json.load(file)

commands_file = 'users.json'
bot = telebot.TeleBot("token")

def load_users_data():
    with open('users.json', 'r') as file:
        return json.load(file)

@bot.message_handler(content_types=['text'])
def get_text_messages(message):
    if message.text == "/start":
        user_id = str(message.from_user.id)
        users_data = load_users_data()

        if user_id in users_data: # если пользователь найден в БД
            user_info = users_data[user_id]
            markup = types.InlineKeyboardMarkup()
            gostart = types.InlineKeyboardButton('Задания', callback_data='gostart')
            markup.add(gostart)
            bot.send_message(message.chat.id, "Привет! Это бот для GameCraft!\nЧто будем делать?", reply_markup=markup)

        else: # если пользователь не найден в БД
            markup = types.InlineKeyboardMarkup()
            next_step_button = types.InlineKeyboardButton('Начнем!', callback_data='next_step_button')
            markup.add(next_step_button)
            bot.send_message(message.chat.id, "Привет!\nЭто бот для марафона по разработке игр GameCraft.\n\nБот используется для отправки ответов на специальные вопросы, подготовленные организаторами.\nПерейдем к регистрации?",reply_markup=markup)

    elif message.text == "/debug.chatid": # узнать t[chat_id]
        bot.send_message(message.chat.id, message.chat.id)

    elif message.text == "/debug.notifications":
        chat_id = message.chat.id
        bot.send_message(message.chat.id, f"Данные об ответах будут отправляться в чат {chat_id}")
    elif message.text.startswith("/rollback"):
        user_id = str(message.from_user.id)
        users_data = load_users_data()
        
        if user_id in users_data:
            # Extracting the command ID from the command, if any
            command_id = message.text.split(" ", 1)[1].strip() if len(message.text.split(" ")) > 1 else None
            
            if command_id is None or command_id.lower() == 'all':
                # Rollback all commands
                for command_info in users_data.values():
                    command_info["task"] = False
            else:
                # Rollback a specific command by ID
                if command_id in users_data:
                    users_data[command_id]["task"] = False

            # Save the updated data back to users.json
            with open('users.json', 'w') as file:
                json.dump(users_data, file, indent=4)

            bot.send_message(message.chat.id, "Откат успешно выполнен.")
        else:
            bot.send_message(message.chat.id, "Вы не авторизованы для использования этой команды.")

@bot.callback_query_handler(func=lambda call: True)
def callback_handler(call):
    if call.data == 'next_step_button':
            markup = types.InlineKeyboardMarkup()
            singleplay = types.InlineKeyboardButton('Создать команду', callback_data='singleplay')
            markup.add(singleplay)
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Создавай свою команду и переходи к основной части бота", reply_markup=markup)

    elif call.data == 'singleplay':
        user_id = str(call.from_user.id)
        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Как называется твоя команда?")
        bot.register_next_step_handler(call.message, process_user_command)

    elif call.data == 'gostart': # ответы на вопросы
        users_data = load_users_data()
        user_id = str(call.from_user.id)

        if user_id in users_data:
                markup = types.InlineKeyboardMarkup()
                give_answer = types.InlineKeyboardButton('Отправить ответ', callback_data='give_answer')
                markup.add(give_answer)
                bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="1. Что вашей командой было уже сделано?\n2. Какие дальнейшие планы по разработке игры?\n3. С чем возникли трудности? Нужна ли помощь?", reply_markup=markup)
        else:
            markup = types.InlineKeyboardMarkup()
            goaway = types.InlineKeyboardButton('Назад', callback_data='goaway')
            markup.add(goaway)
            bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Ошибка", reply_markup=markup)
    elif call.data == 'goaway':
        markup = types.InlineKeyboardMarkup()
        gostart = types.InlineKeyboardButton('Задания', callback_data='gostart')
        markup.add(gostart)
        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="Привет! Это бот для GameCraft!\nЧто будем делать?", reply_markup=markup)
    elif call.data == 'give_answer':
        markup = types.InlineKeyboardMarkup()
        goback = types.InlineKeyboardButton('Назад', callback_data='goback')
        markup.add(goback)
        bot.edit_message_text(chat_id=call.message.chat.id, message_id=call.message.message_id, text="1. Что вашей командой было уже сделано?\n2. Какие дальнейшие планы по разработке игры?\n3. С чем возникли трудности? Нужна ли помощь?\n\n⭐️ Отправьте ответы на вопросы одним сообщением", reply_markup=markup)
        bot.register_next_step_handler(call.message, get_user_answer)

def get_user_answer(message):
    user_answer = message.text.strip()
    users_data = load_users_data()
    user_id = str(message.from_user.id)
    users_data[user_id]["task"] = False
    username = message.from_user.username
    command_name = users_data[user_id]["command_name"]
    with open('users.json', 'w') as file:
        json.dump(users_data, file, indent=4)
    bot.send_message(-1002082672885, f"Команда <b>{command_name}</b> (Капитан: <b>@{username}</b>:) [ID: {user_id}] ответила на вопросы:\n<i>{user_answer}</i>", parse_mode='HTML')
    bot.send_message(message.chat.id, "Ответ успешно отправлен!")
def process_user_command(message):
    global user_command
    user_command = message.text
    command_id = random.randint(100, 999)
    user_id = message.from_user.id
    username = message.from_user.username
    markup = types.InlineKeyboardMarkup()
    gostart = types.InlineKeyboardButton('Начинаем!', callback_data='gostart')
    markup.add(gostart)
    bot.send_message(message.chat.id, f"✅ Команда успешно создана\nНазвание команды: {user_command}\nID команды: {command_id}")
    bot.send_message(message.chat.id, f"Начнем!", reply_markup=markup)
    save_command(user_command, user_id, username)

def save_commands(commands):
    with open(commands_file, 'w', encoding='utf-8') as file:
        json.dump(commands, file, indent=4)


def save_command(user_command, user_id, username):
    try:
        with open(commands_file, 'r', encoding='utf-8') as file:
            commands_data = json.load(file)
    except FileNotFoundError:
        commands_data = {}

    commands_data[str(user_id)] = {
        'command_id': user_id,
        'command_name': user_command,
        'command_captain': user_id,
        'captain_username': username,
        'ball': 0,
        'task': True
    }

    with open(commands_file, 'w', encoding='utf-8') as file:
        json.dump(commands_data, file, indent=4)

bot.polling(none_stop=True, interval=0)



#TODO: Список заданий
#TODO: Автоматическая отправка уведомления о том, что доступны задания
#TODO: Функционал ответа на все задания и последующее сохранение в users.json к пользователю, который отвечает на вопросы. Когда есть
# 3 ответа на 3 вопроса, мы сначала заносим всё в базу данных, а затем удаляем данные по вопросам от конечного пользователя в users.json.
#TODO: Выгрузка .xsls (или как там его) файла (excel) админам бота в определенное время сразу после вопросов.
#TODO: После выгрузки мы начисляем баллы пользователям (автоматически), которые вовремя (до определенного времени (выгрузка)) успели отправить ответы и производим выгрузку топа для админов (по баллам)
# Пользователь получает уведомление о (не-)начислении баллов команде. 